Modular arithmetic is used extensively in such computations as prime number factorization, coding, random number generation, matrix multiplication, polynomial algebra, solution of linear equations, and discrete Fourier transforms, among others. Despite this, conventional algorithms for carrying out multiplication, division and powering in modular arithmetic are cumbersome and do not lend themselves to parallelization very easily. A more serious problem with these algorithms is that they are structurally different. The structural difference leads to different hardware structures necessary for different arithmetic operations; for example, multiplication and addition cannot use the same hardware unless a serial multiplication algorithm is used. However, this results in a reduction in speed which is often intolerable.